package GUI;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;

import Aktorzy.Farmaceuta;
import Aktorzy.Klient;
import Aktorzy.Osoba;
import Baza.BazaDanych;
import Baza.Konfiguracja;

public class OknoGlowne extends JFrame{
	private static final long serialVersionUID = 6682753357743026286L;
	private JFrame frame;
	private Konfiguracja konfiguracja = new Konfiguracja();
	private Osoba osoba;
	
	public OknoGlowne(Osoba osoba){
		this.osoba = osoba;
		createAndShowGUI();
	}
	
	
	/**
	 * Glowna metoda tworzaca okno programu
	 */
	private JFrame createAndShowGUI(){
		
		frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		addComponentToPane(frame.getContentPane());
		frame.setMinimumSize(new Dimension(800,400));
		frame.pack();
		frame.setJMenuBar(getMenu());
		frame.setLocation(50, 50);
		frame.setResizable(false);
        frame.setVisible(true);
        frame.setTitle(konfiguracja.getAppTitle());
        
        return frame;
    }
	
	private void addComponentToPane(Container pane){
		JPanel logoPane = getLogo();
		JPanel loginInfo = getLoginInfo();
		JTabbedPane tabbedWindow = addTabbedWindow();
		
		pane.add(loginInfo, BorderLayout.WEST);
		pane.add(logoPane, BorderLayout.EAST);
		pane.add(tabbedWindow, BorderLayout.SOUTH);
	}

	/**
	 * Klasy elementow okna
	 */
	
	private JPanel getLogo(){
		final ImageIcon logo = new ImageIcon("Leki/logo.jpg");
		JPanel logoPane = new JPanel()  
        {  
            /**
			 * 
			 */
			private static final long serialVersionUID = 1L;

			protected void paintComponent(Graphics g)  
            {  
                Dimension d = getSize();
                g.drawImage(logo.getImage(), 0, 0, d.width, d.height, null);  
   
                super.paintComponent(g);  
            }  
        };
        logoPane.setOpaque( false );  
        logoPane.setPreferredSize(new Dimension(logo.getIconWidth()/4, logo.getIconWidth()/4));//Logo nie moze byc za duze
        
        return logoPane;
	}
	
	private JPanel getLoginInfo(){
		JPanel loginInfo = new JPanel();
		JLabel loginInfoLabel = new JLabel();
		if(osoba instanceof Klient){
			loginInfoLabel.setText(konfiguracja.getLoggedOnField()+" "+osoba.getImie()+" "+osoba.getNazwisko()+" "+(new Date().toString()));
		}else if(osoba instanceof Farmaceuta){
			BazaDanych database = new BazaDanych();
			loginInfoLabel.setText(konfiguracja.getLoggedOnField()+" "+database.selectFarmaceuta(osoba.getLogin()).getStanowisko()+" "+osoba.getImie()+" "+osoba.getNazwisko()+" "+(new Date().toString()));
			database.closeConnection();
		}
		loginInfo.add(loginInfoLabel);
		loginInfo.setOpaque(false);
		
		return loginInfo;
	}
	
	private JTabbedPane addTabbedWindow(){
		JTabbedPane tabbedPane = new JTabbedPane();
		tabbedPane.addTab(konfiguracja.getDrugShowField(), new WyswietlLeki().wypiszLekiPanel());
		BazaDanych database = new BazaDanych();
		if(osoba instanceof Farmaceuta && database.selectFarmaceuta(osoba.getLogin()).getStanowisko().toLowerCase().equals("administrator")){
			tabbedPane.addTab(konfiguracja.getEmployeesShowField(), new WyswietlPracownikow().wypiszPracownikowPanel());
		}
		return tabbedPane;
	}
	
	/**
	 * Elementy Menu
	 */
	private JMenuBar getMenu(){
		JMenuBar menu = new JMenuBar();
		JMenu fileMenu = getFileMenu();
		JMenu editMenu = getEditMenu();
		
		menu.add(fileMenu);
		menu.add(editMenu);
		return menu;
	}
	
	/**
	 * Menu Plik
	 */
	private JMenu getFileMenu(){
		JMenu fileMenu = new JMenu(konfiguracja.getFileMenuField());
		JMenuItem logout = getLogout();
		JMenuItem about = getAuthors();
		JMenuItem exit = getAppClose();
		
		fileMenu.add(logout);
		fileMenu.add(about);
		fileMenu.add(exit);
		
		return fileMenu;
	}
	
	private JMenuItem getLogout(){
		JMenuItem logout = new JMenuItem(konfiguracja.getLogoutField());
		logout.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent event) {
				new OknoLogowania();
				frame.dispose();				
			}
		});
		
		return logout;
	}
	
	private JMenuItem getAuthors(){
		JMenuItem authors = new JMenuItem(konfiguracja.getAboutField());
		authors.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				JFrame authorFrame = null;
            	JOptionPane.showMessageDialog(authorFrame, konfiguracja.getAuthor(), konfiguracja.getAboutField(), 0, new ImageIcon("Leki/logo.jpg"));
			}
		});
		
		return authors;
	}
	
	private JMenuItem getAppClose(){
		JMenuItem close = new JMenuItem(konfiguracja.getExitField());
		close.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
		
		return close;
	}
	
	/**
	 * Menu Edycja
	 */
	private JMenu getEditMenu(){
		JMenu edit = new JMenu(konfiguracja.getEditField());
		JMenuItem changePassword = addChangePassword();
		BazaDanych database = new BazaDanych();
		
		edit.add(changePassword);
		if(osoba instanceof Farmaceuta){
			if(database.selectFarmaceuta(osoba.getLogin()).getStanowisko().toLowerCase().equals("administrator")){
				edit.add(addFarmaceuta());
			}
			edit.add(addLek());
		}
		
		database.closeConnection();
		return edit;
	}
	
	private JMenuItem addChangePassword(){
		JMenuItem changePassword = new JMenuItem(konfiguracja.getChangePasswordField());
		changePassword.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent event) {
				if(osoba instanceof Klient){
					new ZmianaHasla(osoba, false);
				}else if (osoba instanceof Farmaceuta) {
					new ZmianaHasla(osoba, true);
				}
				frame.repaint();
			}
		});
		
		return changePassword;
	}
	
	private JMenuItem addFarmaceuta(){
		JMenuItem farmaceuta = new JMenuItem(konfiguracja.getFarmaceutaNewField());
		farmaceuta.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				new DodajPracownika();
			}
		});
		
		return farmaceuta;
	}
	
	private JMenuItem addLek(){
		JMenuItem lek = new JMenuItem(konfiguracja.getDrugNewField());
		lek.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				new DodajLek();
			}
		});
		return lek;
	}
	
	/**
	 * Przycisk odswiezania danych
	 */
	@SuppressWarnings("unused")
	private JButton getRefreshButton(){
		JButton refresh = new JButton(konfiguracja.getRefreshButton());
		refresh.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				frame.repaint();
			}
		});
		
		return refresh;
	}
}
